package com.ntd.study.algorithm.reduce.staticLength;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import com.ntd.study.algorithm.reduce.StudyReduceMes;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        final String s = StrUtil.removeAllLineBreaks(StudyReduceMes.mes);
        Console.log("原字符串长度", s.length());
        final byte[] ints = strTohex(s);
        final String encode = Base64.encode(ints);
        Console.log(encode);
        Console.log("压缩后字符串长度", encode.length());
    }

    public static byte[] strTohex(String str){
        final List<Byte> arrays = new ArrayList<>();
        for (int i = 0; i < str.length(); i = i + 2) {
            String substring = null;
            try {
                substring = str.substring(i, i + 2);
            } catch (Exception e) {
                substring = str.substring(i);
            }
            final Integer integer = Integer.valueOf(substring, 16);
            arrays.add(integer.byteValue());
        }
        if (str.length() % 2 == 1) {
            final Integer integer = Integer.valueOf(str.substring(str.length() - 1), 16);
            arrays.add(integer.byteValue());
        }
        byte[] ints = new byte[arrays.size()];
        for (int i = 0; i < arrays.size(); i++) {
            ints[i] = arrays.get(i);
        }
        return ints;
    }
//
//    public static byte[] hexToByte(String str){
//        final List<Integer> arrays = new ArrayList<>();
//        for (int i = 0; i < str.length(); i = i + 2) {
//            String substring = null;
//            try {
//                substring = str.substring(i, i + 2);
//            } catch (Exception e) {
//                substring = str.substring(i);
//            }
//            final Integer integer = Integer.valueOf(substring, 16);
//            arrays.add(integer);
//        }
//        if (str.length() % 2 == 1) {
//            final Integer integer = Integer.valueOf(str.substring(str.length() - 1), 16);
//            arrays.add(integer);
//        }
//        return arrays.stream().mapToInt(Integer::intValue).toArray();
//    }

    /**
     * 16进制转换2进制字符串
     * @param str
     * @return
     */
    public static String hexToBinary(String str) {
        final Integer integer = Integer.valueOf(str, 16);
        final String string = Integer.toBinaryString(integer);
        return String.format("%04d", Integer.valueOf(string));
    }

    /**
     * 2进制转16进制
     * @param str
     * @return
     */
    public static String binaryToHex(String str){
        final int i = Integer.parseInt(str, 2);
        return Integer.toHexString(i).toUpperCase();
    }

}
